<?php
namespace app\apijson\query;

/**
 * ArrayQuery
 *
 * 负责处理 [] 结构的多表/分页/递归查询。
 * 由 QueryBuilder 调用。
 */
class ArrayQuery
{
    /**
     * @var QueryBuilder 主调度器，便于递归
     */
    protected $builder;
    public function __construct($builder)
    {
        $this->builder = $builder;
    }
    /**
     * 处理 [] 结构的多表/分页/递归查询
     * @param array $value 解析后的 [] 结构
     * @return array      查询结果，含 []/total 等
     */
    public function handle($value)
    {
        $arr = [];
        $hasPage = array_key_exists('page', $value);
        $hasCount = array_key_exists('count', $value);
        $page = $hasPage ? $value['page'] : null;
        $count = $hasCount ? $value['count'] : null;
        $queryFlag = $value['query'] ?? null;
        $result = [];
        foreach ($value as $tableKey => $tableVal) {
            if (!is_array($tableVal) || !isset($tableVal['type']) || $tableVal['type'] !== 'table') {
                continue;
            }
            if ($hasPage && !isset($tableVal['params']['page'])) $tableVal['params']['page'] = $page;
            if ($hasCount && !isset($tableVal['params']['count'])) $tableVal['params']['count'] = $count;
            if ($queryFlag !== null && !isset($tableVal['params']['query'])) $tableVal['params']['query'] = $queryFlag;
            $rows = $this->builder->tableQuery->handle($tableKey, $tableVal);
            if (is_array($rows) && isset($rows['list']) && isset($rows['total'])) {
                foreach ($rows['list'] as $row) {
                    $arr[] = [$tableKey => $row];
                }
                $result['[]'] = $arr;
                $result['total'] = $rows['total'];
                break;
            }
            if (is_array($rows) && isset($rows['total']) && count($rows) === 1) {
                $result['total'] = $rows['total'];
                $result['[]'] = [];
                break;
            }
            foreach ($rows as $row) {
                $arr[] = [$tableKey => $row];
            }
        }
        if (!isset($result['[]'])) {
            $result['[]'] = $arr;
        }
        return $result;
    }
} 